﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotasDesktop.UILogic;
using GestorDeFlotasDesktop.UILogic.Helpers;
using GestorDeFlotasModelo.Entities;
using GestorDeFlotasModelo.Factorias;
using Persistencia;

namespace GestorDeFlotasDesktop.RegistrarViaje
{
    internal enum TipoViaje
    {
        Calle,
        Cliente
    }
    public partial class RegistrarViajes : BaseForm
    {
        public Viaje ViajeModificado { get; set; }
        List<Viaje> viajesInconsistentes;
        Viaje viajeAEditar;
        public RegistrarViajes(Viaje viajeAEditar)
        {
            InitializeComponent();
            this.viajeAEditar = viajeAEditar;

        }

        protected override void OnVisibleChanged(EventArgs e)
        {
            try
            {
                base.OnVisibleChanged(e);
                this.CargarCombos();
                btnInconsistencias.Visible = true;
                this.CargarCombosDe(viajeAEditar);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void CargarCombosDe(Viaje viajeAEditar)
        {
            try
            {    //Cuando modifico un viaje inconsistente los filtros se inicializan en sus valores
                if (viajeAEditar != null)
                {
                    ComboBoxItem cmb = null;
                    foreach (ComboBoxItem cm in cmbChofer.Items)
                    {
                        if (cm.Value != null && ((Chofer)cm.Value).Id == viajeAEditar.Chofer.Id)
                        {
                            cmb = cm;
                            break;
                        }
                    }
                    this.cmbChofer.SelectedItem = cmb;
                    foreach (ComboBoxItem cm in cmbTurno.Items)
                    {
                        if (cm.Value != null && ((Turno)cm.Value).Id == viajeAEditar.Turno.Id)
                        {
                            cmb = cm;
                            break;
                        }
                    }
                    this.cmbTurno.SelectedItem = cmb;

                    if (viajeAEditar.Cliente != null)
                    {
                        foreach (ComboBoxItem cm in cmbCliente.Items)
                        {
                            if (cm.Value != null && ((Cliente)cm.Value).Id == viajeAEditar.Cliente.Id)
                            {
                                cmb = cm;
                                break;
                            }
                        }
                    }
                    this.cmbCliente.SelectedItem = cmb;
                    this.calendario.Text = viajeAEditar.Fecha.ToShortDateString();
                    this.cmbTipoViaje.Enabled = false;
                    this.txtCantidadFichas.Enabled = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void CargarCombos()
        {
            
            cmbChofer.DisplayMember = "Text";
            cmbChofer.ValueMember = "Value";
            cmbCliente.DisplayMember = "Text";
            cmbCliente.ValueMember = "Value";
            cmbTurno.DisplayMember = "Text";
            cmbTurno.ValueMember = "Value";
            cmbTipoViaje.DisplayMember = "Text";
            cmbTipoViaje.ValueMember = "Value";
            cmbChofer.Items.Add(new ComboBoxItem("Seleccione un Chofer", null));
            cmbCliente.Items.Add(new ComboBoxItem("Seleccione un Cliente", null));
            cmbTurno.Items.Add(new ComboBoxItem("Seleccione un Turno", null));
            cmbTipoViaje.Items.Add(new ComboBoxItem("Seleccione un Tipo de Viaje", null));
            List<Chofer> choferes = Transaccion.Factoria<FactoriaChofer>().SelectTodosHabilitados();
            List<Cliente> cliente = Transaccion.Factoria<FactoriaCliente>().SelectTodosHabilitados();
            List<Turno> turnos = Transaccion.Factoria<FactoriaTurno>().SelectTodosHabilitados();
            foreach (Chofer c in choferes)
            {
                cmbChofer.Items.Add(new ComboBoxItem(c.Apellido + " " + c.Nombre + "-" + c.Dni, c));
            }

            foreach (Cliente c in cliente)
            {
                cmbCliente.Items.Add(new ComboBoxItem(c.Apellido + " " + c.Nombre + "-" + c.Dni, c));
            }

            foreach (Turno c in turnos)
            {
                cmbTurno.Items.Add(new ComboBoxItem(c.Descripcion + " " + c.HoraInicio + "-" + c.HoraFin, c));
            }

            cmbTipoViaje.Items.Add(new ComboBoxItem("Calle", TipoViaje.Calle));
            cmbTipoViaje.Items.Add(new ComboBoxItem("Cliente", TipoViaje.Cliente));

            cmbTipoViaje.SelectedIndex = 0;
            cmbChofer.SelectedIndex = 0;
            cmbCliente.SelectedIndex = 0;
            cmbTurno.SelectedIndex = 0;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.viajeAEditar == null)
                {
                    this.CrearViaje();
                }
                else
                {
                    this.AplicarCambios();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void AplicarCambios()
        {
            if (cmbChofer.SelectedIndex == 0 || cmbTurno.SelectedIndex == 0 )
            {
                MessageBox.Show("Debe seleccionar todos los campos para agregar un viaje");
                return;
            }

            Chofer chofer = ((ComboBoxItem)cmbChofer.SelectedItem).Value as Chofer;
            Turno turno = ((ComboBoxItem)cmbTurno.SelectedItem).Value as Turno;
            DateTime fecha = DateTime.Parse(calendario.Text);
            Cliente cliente = ((ComboBoxItem)cmbCliente.SelectedItem).Value as Cliente;
            TransaccionSesion ts = (TransaccionSesion)((IPersistibleModelo)viajeAEditar).Persistible.Transaccion;
            viajeAEditar.Chofer = chofer;
            viajeAEditar.Turno = turno;
            viajeAEditar.Fecha = fecha;
            viajeAEditar.Cliente = cliente;
            List<ChoferXAuto> asignacion=ts.Factoria<FactoriaChoferXAuto>().SelectXFiltro(chofer,null,turno,true);
            string error = "";
            if (asignacion.Count > 0)
                 viajeAEditar.Auto=asignacion[0].Auto;

            List<Viaje> viajes = ts.Factoria<FactoriaViaje>().SelectRepetidos(chofer, viajeAEditar.Auto, fecha);
            if (viajes.Count > 0)
                error = "Ya hay un viaje registrado con esos datos";

                
            if(String.IsNullOrEmpty(error))
            {
                viajeAEditar.Consistente = true;
                ts.Persistir();

                ts.Factoria<FactoriaViaje>().Suplantar(viajeAEditar);
                this.Hide();
            }
            else
                MessageBox.Show(error);

            

        }

        private void CrearViaje()
        {
            try
            {
                if (cmbChofer.SelectedIndex == 0 || cmbTurno.SelectedIndex == 0 || cmbTipoViaje.SelectedIndex == 0)
                {
                    MessageBox.Show("Debe seleccionar todos los campos para agregar un viaje");
                    return;
                }
                Cliente cliente = null;
                if (((TipoViaje)((ComboBoxItem)cmbTipoViaje.SelectedItem).Value) == TipoViaje.Cliente && this.cmbCliente.SelectedIndex == 0)
                {
                    MessageBox.Show("Debe seleccionar un cliente si el tipo de viaje es de Cliente");
                    return;
                }
                else
                    cliente = ((ComboBoxItem)cmbCliente.SelectedItem).Value as Cliente;

                Chofer chofer = ((ComboBoxItem)cmbChofer.SelectedItem).Value as Chofer;
                Turno turno = ((ComboBoxItem)cmbTurno.SelectedItem).Value as Turno;

                List<ChoferXAuto> autos = Transaccion.Factoria<FactoriaChoferXAuto>().SelectXFiltro(chofer, null, turno, true);
                if (autos.Count == 0)
                {
                    MessageBox.Show("El chofer " + chofer.Apellido + " " + chofer.Nombre + " no tiene asignado un auto en el turno" + turno.Descripcion);
                    return;
                }

                DateTime fecha = DateTime.Parse(calendario.Text); 
                if (fecha.Hour > turno.HoraFin || fecha.Hour < turno.HoraInicio)
                {
                    MessageBox.Show("La hora de viaje ingresada: " + calendario.Text + " no se corresponde con la hora del turno:" + turno.Descripcion + " Hora Inicio:" + turno.HoraInicio + " Hora Fin:" + turno.HoraFin);
                    return;
                }
                Auto auto = autos[0].Auto;

                List<Viaje> viajesRepe = Transaccion.Factoria<FactoriaViaje>().SelectRepetidos(chofer, auto, fecha);
                if (viajesRepe.Count > 0)
                {
                    MessageBox.Show("Ya se han registrado viajes para el chofer o auto seleccionado en esa fecha");
                    return;
                }

                Transaccion.Factoria<FactoriaViaje>().Nuevo(auto, turno, chofer, cliente, int.Parse(txtCantidadFichas.Text),  DateTime.Parse(calendario.Text));
                Transaccion.Persistir();
                MessageBox.Show("El viaje ha sido registrado correctamente");
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

    

        private void btnInconsistencias_Click(object sender, EventArgs e)
        {
            viajesInconsistentes = Transaccion.Factoria<FactoriaViaje>().SelectInconsistentes();
            if (viajesInconsistentes.Count > 0)//Si hay inconsistencias
            {
                MessageBox.Show("Se han detectado inconsistencias en el sistema anterior. Haga click en el boton de inconsistencias para tratarlas.", "Inconsistencias de Viajes", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Contexto.Usuario.AvisadoInconsistenciasViajes = true;
                Transaccion.Factoria<FactoriaUsuario>().SelectXId<Usuario>(Contexto.Usuario.Id.ToString()).AvisadoInconsistenciasViajes = true;
                Transaccion.Persistir();
                ChequeoInconsistencias chequeo = new ChequeoInconsistencias();
                chequeo.Show();
            }
            else
            {
                MessageBox.Show("No se han detectado inconsistencias del sistema anterior.", "Inconsistencias de Viajes", MessageBoxButtons.OK, MessageBoxIcon.Information);
                
            }
            
        }
    }
}

